/**
 *
 */
package 设计模式.单利模式;

/**
 * 懒汉模式
 *
 * @Title:
 * @author zhoujie
 * @date 2018年7月18日 上午10:21:33
 *
 */
public class Singleton02 {
    private static volatile Singleton02 s1 = null;

    // 私有化构造函数
    private Singleton02() {

    }

    public static Singleton02 getData() {
        if (s1 == null) {
            synchronized (Singleton02.class) {
                if (s1 == null) {//双重检测 防止两个线程同时进入第一个s1==null 检测 重复创建s1(并非单利)
                    s1 = new Singleton02();
                }
            }
        }
        return s1;
    }

    /**
     *
     * 防止反序列生成新的单例对象，这是effective Java 一书中说的用此方法
     * @return
     */
    private Object readResolve() {
        System.out.println("readResolve");
        return getData();
    }

    public static void main(String[] args) throws Exception {
        Class c1 = Singleton02.class;
        Singleton02 s1 = (Singleton02) c1.newInstance();
        Singleton02 s2 = Singleton02.getData();
        System.out.println(s1 == s2);

    }
}
